/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package web;

import dtos.LinhaVendaDTO;
import dtos.ProdutoCatalogoDTO;
import dtos.ProdutoDTO;
import dtos.VendaDTO;
import ejbs.FarmaciaBean;
import ejbs.FuncBalcaoBean;
import ejbs.LinhaVendaBean;
import ejbs.ProdutoBean;
import ejbs.ProdutoCatalogoBean;
import ejbs.VendaBean;
import java.io.Serializable;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;
import java.util.logging.Logger;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;
import utils.FacesExceptionHandler;

/**
 *
 * @author Diogo
 */
@ManagedBean
@SessionScoped

public class FuncBalcaoManager implements Serializable {

    static final Logger logger = Logger.getLogger("web.FuncBalcaoManager");

    @EJB
    private VendaBean vendaBean;
    @EJB
    private ProdutoCatalogoBean produtoCatalogoBean;
    @EJB
    private FarmaciaBean farmaciaBean;
    @EJB
    private FuncBalcaoBean funcBean;
    @EJB
    private LinhaVendaBean linhaVendaBean;
    @EJB
    private ProdutoBean produtoBean;

    private LinhaVendaDTO linhaAdicionar;
    private String produtoAdicionar;
    private int quantidadeAdicionar;

    private VendaDTO vendaAtual;
    private List<LinhaVendaDTO> produtosVenda;

    public FuncBalcaoManager() {
        vendaAtual = new VendaDTO();
    }

    public String criarVenda() {
        try {
            String user = FacesContext.getCurrentInstance().getExternalContext().getRemoteUser();
            Date date = new Date();
            vendaAtual = vendaBean.criarVenda(date, user);
            return "funcionarioBalcao_venda.xhtml";
        } catch (Exception e) {
            FacesExceptionHandler.tratarExcecao(e, "Erro do sistema: Não foi possível criar um venda.", logger);
            return null;
        }
    }

    public VendaBean getVendaBean() {
        return vendaBean;
    }

    public void setVendaBean(VendaBean vendaBean) {
        this.vendaBean = vendaBean;
    }

    public VendaDTO getVendaAtual() {
        return vendaAtual;
    }

    public void setVendaAtual(VendaDTO vendaAtual) {
        this.vendaAtual = vendaAtual;
    }

    public List<VendaDTO> getVendas() {
        try {
            List<VendaDTO> vendas = new LinkedList<>();
            String user = FacesContext.getCurrentInstance().getExternalContext().getRemoteUser();
            for (VendaDTO v : vendaBean.getAllVendas()) {
                if (v.getFuncBalcao().equals(user) && !v.isFechada()) {
                    vendas.add(v);
                }
            }
            return vendas;
        } catch (Exception e) {
            FacesExceptionHandler.tratarExcecao(e, "Erro do sistema: Não foi possível devolver a lista de Farmacias.", logger);
            return null;
        }
    }

    public List<ProdutoCatalogoDTO> getProdutoCatalogos() {
        try {
            String user = FacesContext.getCurrentInstance().getExternalContext().getRemoteUser();
            return produtoCatalogoBean.getAllProdutoCatalogos(funcBean.getFuncBalcao(user).getFarmacia());
        } catch (Exception e) {
            FacesExceptionHandler.tratarExcecao(e, "Erro do sistema: Não foi possível devolver a lista de produtos de catalogo.", logger);
            return null;
        }
    }

    public void setVendaAtualPorId(int id) {
        this.vendaAtual = vendaBean.getVenda(id);
    }

    public String goToVenda(int id) {
        this.vendaAtual = vendaBean.getVenda(id);
        produtosVenda = linhaVendaBean.getLinhasVendaFromVenda(vendaAtual.getId());
        return "funcionarioBalcao_venda.xhtml";
    }

    public List<LinhaVendaDTO> getProdutosVenda() {
        return produtosVenda;
    }

    public void setProdutosVenda(List<LinhaVendaDTO> produtosVenda) {
        this.produtosVenda = produtosVenda;
    }

    public LinhaVendaDTO getLinhaAdicionar() {
        return linhaAdicionar;
    }

    public void setLinhaAdicionar(LinhaVendaDTO linhaAdicionar) {
        this.linhaAdicionar = linhaAdicionar;
    }

    public String getProdutoAdicionar() {
        return produtoAdicionar;
    }

    public void setProdutoAdicionar(String produtoAdicionar) {
        this.produtoAdicionar = produtoAdicionar;
    }

    public int getQuantidadeAdicionar() {
        return quantidadeAdicionar;
    }

    public void setQuantidadeAdicionar(int quantidadeAdicionar) {
        this.quantidadeAdicionar = quantidadeAdicionar;
    }

    public List<ProdutoDTO> getProdutosDisponiveis() {
        String user = FacesContext.getCurrentInstance().getExternalContext().getRemoteUser();
        List<ProdutoCatalogoDTO> lista = produtoCatalogoBean.getAllProdutoCatalogos(funcBean.getFuncBalcao(user).getFarmacia());
        List<ProdutoDTO> listaProdutos = new LinkedList<>();
        for (ProdutoCatalogoDTO produtoCatalogo : lista) {
            //for (LinhaVendaDTO lv : vendaAtual.getProdutos()) {
                //if (!produtoBean.copiarProdutoParaDTO(lv.getProduto()).equals(produtoBean.getProduto(produtoCatalogo.getProduto()))) {
                    listaProdutos.add(produtoBean.getProduto(produtoCatalogo.getProduto()));
                //}
            //}
        }
        return listaProdutos;
    }

    public String adicionarLinhaVenda(String produto, int quantidade) {
        linhaVendaBean.criarLinhaVenda(vendaAtual.getId(), produto, quantidade);
        return "funcionarioBalcao_venda.xhtml";
    }

    public String apagarLinhaVenda(Long linhaVendaId){
        linhaVendaBean.apagarLinhaVenda(linhaVendaId);
        return "funcionarioBalcao_venda.xhtml";
    }
    
}
